iT邦幫忙

2021 iThome 鐵人賽

DAY 7
1
自我挑戰組

C 語言筆記系列 第 7

[C 語言筆記--Day07] 如何用 C 語言實作一個泛型物件

  • 分享至 

  • xImage
  •  

大綱

  • 目標
  • 什麼是 union
  • 什麼是 enum
  • 實作一個泛型物件
  • 參考資料

目標

做出一個物件,其可能是 int 或是 double

什麼是 union

unionstruct 的語法非常像,但他們代表的是不一樣的意義
考慮以下 C 語言程式碼:

union {
    int i;
    double d;
} u;
struct {
    int i;
    double d;
} s;

union ustruct s 在記憶體中的存放方式為:

      s(Structure)                    u(Union)
  +-- +--------+                +--  +--------+ --+   
  |   |        |                |    |        |   |   
  |   +--------+                |    +--------+   |   
  |   |        |                |    |        |   |   
i |   +--------+              i |    +--------+   |   
  |   |        |                |    |        |   |   
  |   +--------+                |    +--------+   |   
  |   |        |                |    |        |   |
  +-- +--------+ --+            +--  +--------+   | d
      |        |   |                 |        |   |
      +--------+   |                 +--------+   |
      |        |   |                 |        |   |
      +--------+   |                 +--------+   |
      |        |   |                 |        |   |
      +--------+   |                 +--------+   |
      |        |   |                 |        |   |
      +--------+   | d               +--------+ --+   
      |        |   |
      +--------+   |
      |        |   |
      +--------+   |
      |        |   |
      +--------+   |
      |        |   |
      +--------+ --+   

union 只可以放 id 擇一放一個
例如:

u.i = 82;

這時候 i 的位置就放了 82 進去,而這時候再寫:

u.d = 74.8;

原本 i 的值就被蓋掉了,整個 u 都被拿來放 74.8
利用這個特性就可以做出泛行的效果,但還必須要用 enum 來紀錄他是 int 還是 double 才行

什麼是 enum

enum SUIT {
    CLUBS,
    DIAMONDS,
    HEARTS,
    SPADES
};

其實就跟

#define SUIT        int
#define CLUBS       0
#define DIAMONDS    1
#define HEARTS      2
#define SPADES      3

有一樣的效果

實作一個泛型物件

typedef struct {
    enum (INT_KIND, DOUBLE_KIND) kind;
    union {
        int i;
        double d;
    } u;
} Number;

想塞 (int) 82 時:

Number n;
n.kind = INT_KIND;
n.u.i = 82;

想塞 (double) 74.8 時:

Number n;
n.kind = DOUBLE_KIND;
n.u.i = 74.8;

想 print 出來時:

void print_number(Number n)
{
    if (n.kind == INT_KIND)
        printf("%d", n.u.i);
    else if (n.kind == INT_KIND)
        printf("%g", n.u.d);
}

參考資料

C Programming: A Modern Approach, 2/e


上一篇
[C 語言筆記--Day06] 解題紀錄:MAX-MEX Cut
下一篇
[C 語言筆記--Day08] Thread
系列文
C 語言筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言